perm filename HHTERM.FAI[CMS,LCS] blob
sn#326489 filedate 1978-01-05 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 .INSERT ASMBL.FAI[CMS,LCS]
C00003 00003 Reset
C00005 00004 REFRESH LOOP
C00007 00005 WAIT LOOP AND SETUP
C00009 00006 GEN CHR
C00010 00007 RS232 INTERUPT ROUTINE
C00012 00008 RS232 CONTROL
C00014 00009 SCROLL DOWN
C00016 00010 ASCII TABLE BITS 7 6 5 4 3 2 1 0
C00021 ENDMK
C⊗;
.INSERT ASMBL.FAI[CMS,LCS]
CPL ← = 28 ;CHRS PER LINE
NCHRS ← = 112 ;CHRS PER SCREEN
; Zpage ram
COL: 0
CUR: 0
0
WINDOW: 0
0
TMP: 0
0
LINL: 0
CHRL: 0
BLOCK = 477
; LOC 600
REBUF0: 0 ;REFRESH BUFFER
BLOCK = 128
; LOC 1000
REBUF1: 0
BLOCK = 128
; LOC 1200
REBUF2: 0
BLOCK = 128
; LOC 1400
REBUF3: 0
BLOCK = 128
; LOC 1600
REBUF4: 0
BLOCK = 128
BLOCK = 1024
; LOC 4000
ABUF: 0 ;ASCII CHR BUF
; Reset
; LOC 174000
LOC 174274
RSTA: LDAI 377 ;TURN OFF COLS
STA COLREG
CLD ;CLEAR DECIMAL MODE
LDXI 177 ;STACK DEPTH
TXS ;SETUP STACK
; SETUP AND CLEAR SCREEN
;CLEAR ABUF, SETUP CURSOR AND WINDOW
SD ← 10 ;START OF ABUF
ED ← 20 ;END OF ABUF
LDAI 0
STAZ CUR ;SETUP CURSOR
LDAI SD
STAZ CUR+1
STAZ WINDOW+1
LDAI =32 ;NUMBER OF LINES IN MEM
STAZ WINDOW
CLRM: JSR CR ;<cr> THEN CLEAR LINE *32
JSR LF
JSR CLRLIN ;OR JSR LF(CLRL)?
DECZ WINDOW
BNE CLRM ;WINDOW ← 0
JSR UPDATE ;CLEAR REBUF
; INIT I/O
;INIT RS232
SIODEF ← 225 ;UART CONTROL WORD
ACIAC ← 77776 ;UART CONTROL REG ADDRESS
ACIAD ← 77777 ;UART DATA REG ADDRESS
LDAI 3 ;RESET ACIA
STA ACIAC
LDAI SIODEF ;SETUP DEFAULT I/O CONTROL
STA ACIAC
;INIT KB SCANER
KBD ← 23776 ;KEYBOARD DATA REGISTER ADDRESS
KBC ← 23777 ;KEYBOARD CONTROL REGISTER ADDRESS
LDAI 2 ;KB DPY MODE SET
STA KBC
LDAI 60 ;KB CLK DIV
STA KBC
LDAI 220 ;WRITE DPY RAM ?
STA KBC
SEC
LDAI 376
KBSCAN: STA KBD
ROLA
BCS KBSCAN
LDAI 2 ;CLEAR KB INTERUPT ↓?
STA KBC
LDAI 100 ;READ KB ↑?
STA KBC
CLI ;ENABLE INTERUPTS
; REFRESH LOOP
NCHRS ← =112 ;NUMBER OF CHRS ON SCREEN
DPYSR ← 27777 ;DISPLAY SHIFT REGISTER ADDRESS
LDXI NCHRS-1
RELOOP: LDAI 376
STAZ COL ;SETUP COL BIT 1
SLOOP0: LDAX REBUF0 ;PUT FIRST COL IN SHIFT
STA DPYSR ;REGISTER STARTING WITH LAST CHR
DEX
BPL SLOOP0
JSR NXCOL ;TURN ON COL AND WAIT
SLOOP1: LDAX REBUF1 ;SECOND
STA DPYSR
DEX
BPL SLOOP1
JSR NXCOL
SLOOP2: LDAX REBUF2 ;THIRD
STA DPYSR
DEX
BPL SLOOP2
JSR NXCOL
SLOOP3: LDAX REBUF3 ;FORTH
STA DPYSR
DEX
BPL SLOOP3
JSR NXCOL
SLOOP4: LDAX REBUF4 ;FIFTH
STA DPYSR
DEX
BPL SLOOP4
JSR NXCOL
JMP RELOOP
; WAIT LOOP AND SETUP
COLREG ← 33777 ;COL ENABLE REGISTER ADDRESS
CPL ← = 28 ;NUMBER OF CHRS PER LINE
NXCOL: LDAZ COL
STA COLREG ;TURN ON COL
LDAZ UPFLG
BEQ WAIT
LDAI 0
STAZ UPFLG
JSR UPDATE
;WAIT(BRIGHTNESS - UPDATE)
JMP NXCOL
WAIT: ;WAIT(BRIGHTNESS)
NXCOL: SEC
ROLZ COL ;SHIFT FOR NEXT COL
LDXI NCHRS-1
LDAI 377
STA COLREG ;TURN OFF COL
RTS
; UPDATE SCREEN
UPDATE: LDAZ WINDOW
STAZ TMP
LDAZ WINDOW+1
STAZ TMP+1
LDAI 4 ;NUMBER OF LINES PER SCREEN
STAZ LINL
LDYI 0
LLOOP: LDAI CPL
STAZ CHRL
ULOOP: LDXI 0
LDAIX TMP
JSR WCHR
INY
INCZ TMP
DECZ CHRL
BNE ULOOP
DECZ TMP ;FOR 32 CHRS PER LINE
LDAZ TMP
ANDI 340
CLC
ADCI 40 ;NEXT LINE
STAZ TMP
BCC NOOF
INCZ TMP+1
LDAZ TMP+1
CMPI ED
BNE NOOF
LDAI SD
STAZ TMP+1
NOOF: DECZ LINL
BNE LLOOP
RTS
; GEN CHR
WCHR: TAX ;X ← ASCII CHR
LDAX CGEN0 ;FILL REBUF COLS 0-4
STAY REBUF0
LDAX CGEN1
STAY REBUF1
LDAX CGEN2
STAY REBUF2
LDAX CGEN3
STAY REBUF3
LDAX CGEN4
STAY REBUF4
RTS
; KB INTERUPT ROUTINE
KBINT: PHA ;SAVE REGS
TXA
PHA
FLUSH: LDX KBD ;GET CHR FROM KB
; LDA KBC ;CK IF FIFO EMPTY?
; ANDI 7
; BNE FLUSH
LDAI 2 ;CLEAR KB INTERUPT
STA KBC
CLI
WAIT: LDA ACIAC
ANDI 2 ;CHECK IF FULL
BEQ WAIT
LDAX ASCII ;CONVERT KB TO ASCCI
STA ACIAD ;OUTPUT IT
PLA ;RESTORE REGS
TAX
PLA
RTI ;RETURN
; RS232 INTERUPT ROUTINE
UNDEF ← 377
RSINT: PHA ;SAVE REGS
TXA
PHA
TYA
PHA
LDA ACIAC ;GET UART STATUS
ANDI 160 ;PAR∨OV∨FE
BEQ GCHR
ERROR: ;RECIVE ERROR
GCHR: LDA ACIAD ;GET CHR FROM ACIA
ANDI 177 ;7 BITS
CMPI UNDEF ;
BCC SCNTRL
CMPI UNDEF ;
BCS SCNTRL
LDXI 0
STAIX CUR ;STORE IN ABUF
;CK IF IN WINDOW
;WRITE CHR IN REBUF?
; OR SET UPDATE FLAG?
INCUR: INCZ CUR
LDAZ CUR
ANDI 37
CMPI CPL
BCC LESS ;BRANCH IF STILL ON PAGE
JSR CR
JSR LF
JSR CLRLIN ;JSR LF(CLRL)?
LESS:
;CK FOR SCROLL
;CK UPDATE? UPDATE LINE?
RSRTRN: ;SHOW CURSOR?
PLA ;RESTORE REGS
TAY
PLA
TAX
PLA
RTI ;RETURN
; RS232 CONTROL
SCNTRL: CMPI 12 ;<lf>
BEQ RLF
CMPI 15 ;<cr>
BEQ RCR
CMPI 177 ;<bspace>
BEQ RBS
CMPI UNDEF ;SCROLL UP
BEQ SCRLU
CMPI UNDEF ;SCROLL DOWN
BEQ SCRLD
CMPI UNDEF ;BRIGHTER
BEQ BRIGHT
CMPI UNDEF ;DIMMER
BNE RSRTRN
;DIM? HOME ∨ SET CUR?
JMP RSRTRN
BRIGHT:
; <lf>
RLF: JSR LF
JSR CLRLIN ;CLEAR LINE?
;CK SCROLL
;UPDATE? UPDATE LINE?
JMP RSRTRN
; <cr>
RCR: JSR CR
;UPDATE? ∨ UPDATE LINE? CHR?
JMP RSRTRN
; <bspace>
RBS: LDAZ CUR
BNE NOBACK
DECZ CUR+1
LDAZ CUR+1
CMPI SD-1 ;CK IF BEFORE BEGINING
BNE NOBACK
LDAI ED-1 ;WRAP AROUND
STAZ CUR+1
NOBACK: DECZ CUR
LDAZ CUR
ANDI 37
CMPI CPL
BCC NORLF ;LESS THAN LINE LEN
LDAZ CUR
ANDI 340
ORAI CPL-1
STAZ CUR
NORLF: LDAI 40 ;<space>
LDXI 0
STAIX CUR
;CK SCROLL
;CK UPDATE
JMP RSRTRN
; SCROLL DOWN
SCRLD: LDAZ WINDOW
CLC
ADCI 40 ;FOR ≤32 CHRS
STAZ WINDOW
BCC NOWA
INCZ WINDOW+1
LDAZ WINDOW+1
CMPI ED
BNE NOWA
LDAI SD
STAZ WINDOW+1
NOWA: INCZ UPFLG ;SET UPDATE FLG
JMP RSRTRN
; SCROLL UP
SCRLU: LDAZ WINDOW
SEC
SBCI 40 ;≤32 CHRS PER LINE
STAZ WINDOW
BCS NOWA
DECZ WINDOW+1
LDAZ WINDOW+1
CMPI SD-1
BNE NOWA
LDAI ED-1
STAZ WINDOW+1
JMP NOWA
; <lf> SUBROUTINE
LF: LDAZ CUR
CLC
ADCI 40
STAZ CUR
BCC NORA
INCZ CUR+1
LDAZ CUR+1
CMPI ED
BNE NORA
LDAI SD
STAZ CUR+1
NORA: RTS
; <cr> SUBROUTINE
CR: LDAZ CUR
ANDI 340
STAZ CUR
RTS
; CLEAR LINE SUBROUTINE
CLRLIN: LDYI CPL-1 ;CLEAR LINE. # CHRS PER LINE
LDAI 40 ;<space>
CLRL: STAIY CUR ;FILL CURSOR TO CURSOR + CPL
DEY ;WITH SPACES
BPL CLRL
RTS
; ASCII TABLE BITS 7 6 5 4 3 2 1 0
; LOC 175000 CNTL SHFT S2 S1 S0 RL2 RL1 RL0
LOC 175324
ASCII: "0" ↔ "1" ↔ "2" ↔ "3" ↔ "4" ↔ "5" ↔ "6" ↔ "7"
"8" ↔ "9" ↔ "A" ↔ "B" ↔ "C" ↔ "D" ↔ "E" ↔ "F"
"G" ↔ "H" ↔ "I" ↔ "J" ↔ "K" ↔ "L" ↔ "N" ↔ "O"
"P" ↔ "Q" ↔ "R" ↔ "S" ↔ "T" ↔ "U" ↔ "V" ↔ "W"
"X" ↔ "Y" ↔ "Z" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
"@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@" ↔ "@"
; CHRGEN FONT = CAP7X5
; LOC 176000
LOC 176274
CGEN0: BLOCK = 128
CGEN1: BLOCK = 128
CGEN2: BLOCK = 128
CGEN3: BLOCK = 128
CGEN4: BLOCK = 128
; INTER VECTS
; LOC 177772
LOC 200266
NMIV: KBINT∧377 ;NMIV: ABSO KBINT
370
RSTV: 0 ;RSTV: ABSO RSTA
370
IRQV: RSINT∧377 ;IRQV: ABSO RSINT
370
END